﻿import std.file;
import std.stdio;
import std.conv;
import std.outbuffer;


void main(char[][] args){

    if(args.length <3 ) 
    {
        writefln(" err! must be [3] args
                1--- fontbin filename
                2--- fonttxt filename
                3--- fontsize   (must be Number)"); 
        return;
    }
    
    int         fw;             //单个字模宽度
    int         i;              //单个字模面积
 

    
    ubyte[] fntbin=  cast(ubyte[])std.file.read(args[1]);       // 参数1 是 字模数据文件名
    wchar[] fnttxt=  cast(wchar[])std.file.read(args[2]);       // 参数2 是 字体文本文件名
    
    fw= std.conv.toInt(args[3]);                                // 参数3 是 字模点阵宽度
    i=  fw*fw;
    
    fnttxt= fnttxt[1..$];       // 删掉前两个字节, 这里一个 wchar 等于2字节
    
    ubyte[]       bt;

    
   bt.length   = fntbin.length / 8;	//压缩后的点阵为原来的8分之一
   writefln("字数= ",fnttxt.length);
   writefln("bit size=== ", bt.length);
    
    
    const  ubyte[8]  mask = [ 1, 1<<1 ,1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7 ]; 
   		
  
	int r=0;
    for(int j=0; j<fntbin.length; j++)	//遍历所有字模点阵
    {
		if(fntbin[j])	//如果此点为真  
		{
			bt[j/8] |= mask[j%8];
			r++;
		}
    }   
 
    writefln("bit size=== ", bt.length, "有效字==",r);
    
    
    OutBuffer ob= new OutBuffer;
    
    //输出格式
    ob.write(fw);						//4字节: 字模宽度 如,12
    ob.write(fnttxt.length);			//4字节: 字模数量, 如 gb2312为 94*94
    ob.write(cast(ubyte[])fnttxt);		//文本:	字符
    ob.write(bt);			//字模集,大小为 字模数量 * 字模面积 
 
    std.file.write("zm.bitfont",ob.toBytes);
    
    
    
}
    